package controllers;

import play.*;
import play.db.DB;
import play.mvc.*;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

import javax.persistence.Entity;

import org.joda.time.Hours;

import models.*;

public class Application extends Controller {
	//auxiliar a agendar
	
	public static String Id_serv_aux_agendar;
	public static String Id_funcionario_aux_agendar;
	public static String Id_horario_aux_agendar;
	public static String data_aux_agendar;
	public static String cpf_aux_agendar;
	public static Cliente Cliente_aux_agendar = new Cliente();
	
	public static double total_aux_agendar;
	public static List<String> Func_agendar = new ArrayList();
	public	static List<String> servico_agendar = new ArrayList();
	public	static List<String> horas_agendar = new ArrayList();
	public static	List<String> data_agendar = new ArrayList();
	public static List<ItensReserva> listadeItens = new ArrayList();
	//fim de auxiliares
	//Inicio ok

	
	public static void index2()
	{
		render();
	}
	
    public static void index() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
    	/*
    	 try //A captura de exceções SQLException em Java é obrigatória para usarmos JDBC.   
   {  
       // Este é um dos meios para registrar um driver   
       Class.forName("jdbc:sqlserver://localhost;database=BD_HAIRIII").newInstance();  
         
       // Registrado o driver, vamos estabelecer uma conexão  
       Connection con = DriverManager.getConnection("com.microsoft.sqlserver.jdbc.SQLServerDriver","sa","senha");  
   }  
   catch(SQLException e)  
   {  
       // se houve algum erro, uma exceção é gerada para informar o erro   
       e.printStackTrace(); //vejamos que erro foi gerado e quem o gerou  
   }  
    	 
    	
    	*/
    	render();
    	
    }
    
    //pronto com sql
    public static void inserir_horario(String horas) throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {
    	
    	 Connection con = DB.getConnection();
		 Statement stm = con.createStatement();
		String [] array = horas.split(",");;
    	  
    	for(int i =0;i<array.length;i++)
    	{
    		System.out.println(array[i]);
    	Horario hora = new Horario();
    	hora.setHora(array[i]);
    	 String SQL = " Insert into Horario (hora) values ('"+ hora.getHora() +"')";
    		
 		stm.execute(SQL);
    	
    	}
    	Application.Escolha_admin();
    }
    //pronto formulario para horario -só admin
    
    public static void Inserir_form_horario(){
        
     	render();
    }
    //método para inserir cliente
    
    //método para salvar clientes
    public static void inserir_cliente(Cliente c) throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException{
    	
		Secure secure = new Secure();
    	String nomeusuario = secure.getNomeuser();
    	/*
    	int cpf =  c.cpf;
		String nome =  c.nome;
		String endereco =  c.endereco;
		String telefone = c.telefone;
		String tipo = c.tipo;
		String login=c.login;
		String senha=c.senha;
		
	
		String Cliente = null ;
    	
    	 Connection con = DB.getConnection();
		 Statement stm = con.createStatement();
		 String SQL = " Insert into Pessoa (Dtype,tipo,nome,telefone,endereco,cpf,login,senha) values ('" + Cliente +"' , '"+ tipo+"' , '" + nome+"' , '"+telefone+"' , '"+endereco+"' ,"+cpf+", '"+login+"' , '"+senha+"')";
	
		stm.execute(SQL);*/
    		c.save();
    	if( secure.getNomeuser().equals("Admin"))
		{Application.Escolha_admin();}
		
		
		index();
    }
    
    //método para salvar funcionarios
    
    public static void inserir_funcionario(Funcionario f, String horas ) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
    	
    	    	
    	List<Horario> horario_aux = new ArrayList();
    	String[]array = horas.split(",");
    	int aux= array.length;
    	//buscar horario com os id's retornados
    	for(int i=0;i<aux;i++)
    	{
    		
    		long lon = Long.parseLong(array[i]);
    		
    		//sql
    		Connection con = DB.getConnection();
    		 Statement stm = con.createStatement();
    		 String SQL = "Select * From Horario";
     		ResultSet rs = stm.executeQuery(SQL);
    		 //fim sql
    		while(rs.next()){
    		
    		Horario h = new Horario();
    		String h2=rs.getString("hora");
			long id = rs.getLong("id");
			if(id == lon){
			 h.id=id;
			 h.hora=h2;
			 //salvar em uma lista temporaria os horarios
    		horario_aux.add(h);
    		
			}
    		}
    	}
    	
    	f.hora = horario_aux;
    	f.save();
    
    	Application.Escolha_admin();
    	
    }
        //método para mostrar formulario de inserçaõ de clientes
  
    //pronto formulario cadastrar cliente -todos
    public static void Inserir_form_cliente()
    {
    	render();
    	
    }
    //formulario para cadastrar funcionario - só admin
    
     public static void Inserir_form_func() throws SQLException{
    	
    	//consulta sql
    	Connection con = DB.getConnection();
		 Statement stm = con.createStatement();
		 String SQL = " Select * From Horario";
		 ResultSet rs = stm.executeQuery(SQL);
		//fim da consulta
		 
		 List<Horario> hors = new ArrayList<Horario>();
		 while(rs.next())
		 {
			 Horario h = new Horario();
			 String h2=rs.getString("hora");
			 long id = rs.getLong("id");
			
			 h.id=id;
			 h.hora=h2;
			
			 hors.add(h);
		 }
		 System.out.println("horas no sql" + hors);
    	render(hors);
    }
  
     //formulario e método para buscar o funcionario
     public static void buscarfunc(String cpdf) throws SQLException
     {
		 List<Pessoa> p= new ArrayList();
		 
		 if(cpdf == null){
			 render(p);
		 }
			
		 Connection con = DB.getConnection();
		 Statement stm = con.createStatement();
		
		 String SQL = " Select * From Pessoa Where cpf ="+cpdf;
		
		 ResultSet rs = stm.executeQuery(SQL);
		 
		
		rs.next();
		Funcionario pe_temp = new Funcionario();
		    				
		long id = rs.getLong("id");
		int cpf =  rs.getInt("cpf");
		String nome =  rs.getString("nome");
		String endereco =  rs.getString("endereco");
		String telefone = rs.getString("telefone");
		String tipo = rs.getString("tipo");
		String funcao = rs.getString("funcao");
		String salario = rs.getString("salario");
		System.out.println("cpf: " + cpf + "nome :"+nome );
		
		System.out.println("ID @@@@ " + id);
		
		pe_temp.id=id;
		pe_temp.cpf=cpf;
		pe_temp.nome=nome;
		pe_temp.endereco=endereco;
		pe_temp.telefone=telefone;
		pe_temp.tipo=tipo;
		pe_temp.funcao=funcao;
		pe_temp.salario=salario;
		
		p.add(pe_temp);
		
		 
		 render(p);
}
    
     //formulario e método para buscar o cliente
     public static void buscarcliente(String cpdf) throws SQLException
     {
	 List<Pessoa> p= new ArrayList();
	
	 //inicio sql
	 Connection con = DB.getConnection();
	 Statement stm = con.createStatement();
	 String SQL = " Select * From Pessoa Where cpf = " +cpdf;
	 ResultSet rs = stm.executeQuery(SQL);
	//fim sql

	 while(rs.next()){
	Pessoa pe_temp = new Pessoa();
	
	long id = rs.getLong("id");
	int cpf = rs.getInt("cpf");
	String nome = rs.getString("nome");
	String endereco = rs.getString("endereco");
	String telefone = rs.getString("telefone");
	String tipo = rs.getString("tipo");
	System.out.println("cpf: " + cpf + "nome :"+nome );

	pe_temp.id=id;
	pe_temp.cpf=cpf;
	pe_temp.nome=nome;
	pe_temp.endereco=endereco;
	pe_temp.telefone=telefone;
	pe_temp.tipo=tipo;
	p.add(pe_temp);
	 	}
 
	 render(p);
        	
    }
    //método para remover pessoas
    

    //método para remover registros com o "Id"
    public static void remover(long id) throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException{
	Secure secure = new Secure();
	String nome = secure.getNomeuser();
	 Pessoa p = Pessoa.findById(id);
System.out.println("tipo : "+ p.tipo + "   " +p.nome);
	 String tipo = p.tipo;
	 
		if (p != null){
			 if(tipo =="Funcionario")
			 {
			 Connection con = DB.getConnection();
			 Statement stm = con.createStatement();
			 String SQL="delete from Func_Res where func_id="+id;
			 stm.executeUpdate(SQL);
			 }
			p.delete();
	}
	System.out.println("esec");
		if(nome == null){
		Application.listar("tipo");
		}
		if(nome.equals("Admin"))
		{
		Application.Escolha_admin();
		}else{Application.listar("tipo");}
		
		
}
    //listar cadastro de pessoas de acordo com o tipo
    
 
    //método para listar pessoas ou funcionario
    public static void listar(String tipo) throws SQLException
 {
    	 Connection con = DB.getConnection();
		 Statement stm = con.createStatement();
		 
	 List<Pessoa> p= new ArrayList();
	 String SQL =" Select * From Pessoa " ;
	 ResultSet rs = stm.executeQuery(SQL);
	// ResultSet rs = DB.executeQuery(SQL);
	 	
	 while(rs.next()){
			Pessoa pe_temp = new Pessoa();
			
			long id = rs.getLong("id");
			int cpf = rs.getInt("cpf");
			String nome = rs.getString("nome");
			String endereco = rs.getString("endereco");
			String telefone = rs.getString("telefone");
			String type = rs.getString("tipo");
			System.out.println("cpf: " + cpf + "nome :"+nome );


		pe_temp.id=id;
		pe_temp.cpf=cpf;
		pe_temp.nome=nome;
		pe_temp.endereco=endereco;
		pe_temp.telefone=telefone;
		pe_temp.tipo=tipo;
		if(type.equals(tipo))
		{
					p.add(pe_temp);
		}
		}
		 System.out.println("pessoas "+p);
		render(p);
	}
 
       //método para cadastrar serviço
    
     public static void cadastroservi(String funcionario ,String nome, double valor) throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException
 {
    	 Secure secure = new Secure();
 		String nomeusuario = secure.getNomeuser();
	 System.out.println("Cadastro de servico");
	 Servico servico = new Servico();
	 
	 List<Funcionario> pessoa_aux_servico=new ArrayList();
	
	List<Long> aux2= new ArrayList();
	
	long []arrayint = new long[funcionario.length()];
	 String[] array = funcionario.split(",");
	 for(int i = 0;i<array.length;i++)
	 {
		 int aux=0;
		 arrayint[i]=Long.parseLong(array[i]);
		 System.out.println("arry de int "+arrayint[i]);
		 
	
		Funcionario funcionario_novo = Funcionario.findById(arrayint[i]);		 
		aux=(int) arrayint[i];
				 
		pessoa_aux_servico.add(funcionario_novo);
		
	 }
	 servico.funcionario = pessoa_aux_servico;
	 System.out.println("pessoa"+pessoa_aux_servico);
	 System.out.println("funcionario"+servico.funcionario);
	 System.out.println("rs"+aux2);
	 
	 servico.idfuncionario=funcionario;
	 servico.valor=valor;
	 servico.nome = nome;
	 servico.save();
	 System.out.println("\n nome do serviço: "+servico.nome+"==="+"Nomes dos Funcionarios=="+pessoa_aux_servico+"valor do Serviço: =="+servico.valor+"\n\n");
		
	if(nomeusuario.equals("Admin"))
	{Application.Escolha_admin();}
	index();
	 
 }
     
     //formulário para cadastro de serviço - admin e funcionario
     public static void formserv()
 {
    	List<Funcionario> lp = Funcionario.find("tipo is ?", "Funcionario").fetch();
	 for (Funcionario funcionario : lp) {
	 }
	 render(lp);
 }
 
    //implementar

   /* 
    public static void agendar(String ids_servico,String id_funcionario,String Data,String id_hora) throws SQLException{
	  	
    	double valor_total = 0;
    	List<Funcionario> Lista_Func_aux = new ArrayList();
   		List<Servico> serv = new ArrayList();
   		List<Horario> horas = new ArrayList();
    	//conexão para todo o método
   	 	 Connection con = DB.getConnection();
		 Statement stm = con.createStatement();
		//String sql11 = "delete from ItensReserva select * from ItensReserva";
		// stm.execute(sql11);
		
		 if(Data != null)
	    	{
			 Id_serv_aux_agendar = null;
			Id_funcionario_aux_agendar=null;
			Id_horario_aux_agendar=null;
			 data_aux_agendar = Data;
			data_agendar.add(Data);
				 		
	    	}
    	//1º listar os serviços do salao
		 String SQL = " Select * From Servico ";
		  ResultSet rs = stm.executeQuery(SQL);
			 
			while(rs.next()){
			String nome = new String();
			Servico servico = new Servico();	
			servico.id=rs.getLong("id");
			servico.nome=rs.getString("nome");
			servico.valor=rs.getDouble("valor");
			serv.add(servico);	
	
			}
			//fm listar servico 
			============================
			if(ids_servico != null){
			Id_serv_aux_agendar = ids_servico;
		    servico_agendar.add(ids_servico);	
		   
		    //valor do servico
		    String SQL_busca_valor = " Select valor from servico where id ="+ids_servico;
			ResultSet rs_valor = stm.executeQuery(SQL_busca_valor);		
		    rs_valor.next();
			valor_total= rs_valor.getDouble("valor");
			total_aux_agendar = total_aux_agendar + valor_total ;
			System.out.println("Total = " + total_aux_agendar);
			
			//selecionar os funcionarios q fazem aquele servico escolhido
			String []array = ids_servico.split(","); 
			int cont = array.length;
			for (int i =0;i<cont;i++)
			{
			long idserv;
			idserv= Long.parseLong(array[i]);
			String SQL_busca_func = " Select * from pessoa p, Func_Res fs where p.id = fs.func_id and fs.serv_id ="+idserv;
			ResultSet rs_funcionario = stm.executeQuery(SQL_busca_func);
			
			while(rs_funcionario.next()){
					
					Funcionario func = new Funcionario();
					func.nome = rs_funcionario.getString("nome");
					func.cpf=rs_funcionario.getInt("cpf");
					func.endereco=rs_funcionario.getString("endereco");
					func.funcao=rs_funcionario.getString("funcao");
					func.salario=rs_funcionario.getString("salario");
					func.id=rs_funcionario.getLong("id");
		 			
			Lista_Func_aux.add(func);
			//fim da procura de funcionarios
			
			}
		}
			
	}
			//Procurar os horarios disponiveis do funcionario escolhido
				
		if(id_funcionario != null)
		{
			Id_funcionario_aux_agendar = id_funcionario;
			Func_agendar.add(id_funcionario);
			
			String SQL_busca_horario = " Select * from Horario h, Func_horario fh where h.id = fh.horario_id and fh.func_id ="+id_funcionario;
			ResultSet rs_horario = stm.executeQuery(SQL_busca_horario);		
			while(rs_horario.next())
			{
			Horario h = new Horario();
			String hora=rs_horario.getString("hora");
			long id =rs_horario.getLong("id");
			h.hora = hora;
			h.id=id;
			horas.add(h);
			}
			
		}
		if(id_hora != null)
		{
			Id_horario_aux_agendar = id_hora;
		 horas_agendar.add(id_hora);
		}
				
			System.out.println("id funcionario  "+Func_agendar  );
			System.out.println("id servico  "+servico_agendar  );
			System.out.println("data  "+ data_agendar  );
			System.out.println("Id horario  "+ horas_agendar  );
			
			if(data_agendar.size() != 0 && servico_agendar.size()!=0 && Func_agendar.size()!=0 && horas_agendar.size() != 0){
				
				System.out.println("//id funcionario  "+Id_funcionario_aux_agendar  );
				System.out.println("id servico  "+Id_serv_aux_agendar  );
				System.out.println("data  "+ data_aux_agendar );
				System.out.println("Id horario  "+ Id_horario_aux_agendar  );
				
			String sqlinserir="insert into ItensReserva (Id_servico,Id_funcionario,Id_hora,data) values ('"+Id_serv_aux_agendar+"','"+Id_funcionario_aux_agendar +"','"+Id_horario_aux_agendar+"','"+data_aux_agendar+"')";
			stm.execute(sqlinserir);
			}		
			
					valor_total = total_aux_agendar;
			render(serv , Lista_Func_aux , horas,valor_total);
 }
*/
    //método para listar os serviços e seus funcionários
     public static void listarServico() throws SQLException
 {
    	 List<Servico> serv = new ArrayList();
    	 List<String> Nomes = new ArrayList();
    	 
    	System.out.println("\nListar Servico ++==");
     
    	 	String SQL = " Select * From Servico ";

    	 
    	 ResultSet rs = DB.executeQuery(SQL);
    	 
    	while(rs.next()){
    		String nome = new String();
    	Servico servico = new Servico();	
    	servico.id=rs.getLong("id");
    	servico.nome=rs.getString("nome");
    	servico.valor=rs.getDouble("valor");
    	serv.add(servico);
    	
    	String SQL2 = " Select Func_ID From Func_Res Where Serv_ID ="+servico.id;
    	ResultSet rsf = DB.executeQuery(SQL2);
    	
    	while(rsf.next()){
    		 
    		String SQL3 = " Select * From Pessoa Where ID = " + rsf.getLong("Func_ID");
    		ResultSet rsfu = DB.executeQuery(SQL3);
    		
    		while(rsfu.next()){
    			
    			String aux = rsfu.getString("nome");
    			
    			nome=nome+aux.concat(",");
    			
    			
    			System.out.println("nome 1º :"+ aux );
    			System.out.println("====== :" );
    			
    		}
    		
    		System.out.println("nome :"+ nome );
    		System.out.println("Lista de nomes "+Nomes );
    	}
    	Nomes.add(nome);
    	
    	}
	
	render(serv,Nomes);
	}


//Salvar Agendamento


public static void indexBemVindo()
{
	Secure secure = new Secure();
	String nome = secure.getNomeuser();
	render(nome);
}


public static void OpcaoFuncionario()
{
	render();
}

public static void Escolha_admin()
{
render();
}

public static void AreaCliente(){
	render();
}

public static void data_agendar(String Data ,String cpdf) throws SQLException
{
	//verificar se pessoa existe
	Cliente pe_temp = new Cliente();
	pe_temp.find("byCPF", Integer.valueOf(cpdf)).fetch();
	 if (pe_temp.id == null)
	 {
		 Cliente_aux_agendar=pe_temp;
		 Application.Inserir_form_cliente();
	 }else{
		 
	 //fim da verificação
	
	data_aux_agendar= Data;
	Application.servico_agendar();
}
	 }
public static void servico_agendar() throws SQLException
{
	List<Servico> serv = new ArrayList();
	Connection con = DB.getConnection();
	 Statement stm = con.createStatement();
	//1º listar os serviços do salao
	 String SQL = " Select * From Servico ";
	  ResultSet rs = stm.executeQuery(SQL);
		 
		while(rs.next()){
		String nome = new String();
		Servico servico = new Servico();	
		servico.id=rs.getLong("id");
		servico.nome=rs.getString("nome");
		servico.valor=rs.getDouble("valor");
		serv.add(servico);	

		}
		String aux_data = data_aux_agendar;
		render(serv,aux_data);
}
public static void funcionario_agendar(String ids_servico) throws SQLException
{
	Connection con = DB.getConnection();
	 Statement stm = con.createStatement();
	 double valor_total = 0;
	 List<Funcionario>  Lista_Func_aux= new ArrayList();
	 if(ids_servico != null){
		
	    servico_agendar.add(ids_servico);	
	 
	    //valor do servico
	    String SQL_busca_valor = " Select * from servico where id ="+ids_servico;
		ResultSet rs_valor = stm.executeQuery(SQL_busca_valor);		
	    rs_valor.next();
		valor_total= rs_valor.getDouble("valor");
		String nome_serv = rs_valor.getString("nome");
		total_aux_agendar = total_aux_agendar + valor_total ;
		System.out.println("Total = " + total_aux_agendar);
		
		//selecionar os funcionarios q fazem aquele servico escolhido
		
		long idserv;
		idserv= Long.parseLong(ids_servico);
		String SQL_busca_func = " Select * from pessoa p, Func_Res fs where p.id = fs.func_id and fs.serv_id ="+idserv;
		ResultSet rs_funcionario = stm.executeQuery(SQL_busca_func);
		
		while(rs_funcionario.next()){
				
				Funcionario func = new Funcionario();
				func.nome = rs_funcionario.getString("nome");
				func.cpf=rs_funcionario.getInt("cpf");
				func.endereco=rs_funcionario.getString("endereco");
				func.funcao=rs_funcionario.getString("funcao");
				func.salario=rs_funcionario.getString("salario");
				func.id=rs_funcionario.getLong("id");
				 Lista_Func_aux.add(func);
		}
		String aux_data = data_aux_agendar;
		Id_serv_aux_agendar=nome_serv;
		render( Lista_Func_aux,nome_serv,aux_data);
		
}
}

	
public static void horario_agendar(String id_funcionario) throws SQLException
{
	List<Horario> horas = new ArrayList();
	Connection con = DB.getConnection();
	 Statement stm = con.createStatement();
	if(id_funcionario != null)
	{
		Id_funcionario_aux_agendar = id_funcionario;
		Func_agendar.add(id_funcionario);
		
		String SQL_busca_horario = " Select * from Horario h, Func_horario fh where h.id = fh.horario_id and fh.func_id ="+id_funcionario;
		ResultSet rs_horario = stm.executeQuery(SQL_busca_horario);		
		while(rs_horario.next())
		{
		Horario h = new Horario();
		String hora=rs_horario.getString("hora");
		long id =rs_horario.getLong("id");
		h.hora = hora;
		h.id=id;
		horas.add(h);
		}
		
	}
	String nome_serv =Id_serv_aux_agendar;
	String aux_data = data_aux_agendar;
	render(aux_data,horas,nome_serv);
	
}
public static void add_itensreserva(String id_hora)
{
	ItensReserva itensr= new ItensReserva();
	
	
	Horario ha = Horario.findById(id_hora);
	Servico se = Servico.findById(Id_serv_aux_agendar);
	Funcionario fu = Funcionario.findById(Id_funcionario_aux_agendar);
	
	if(id_hora != null)
	{
		Id_horario_aux_agendar = id_hora;
	 horas_agendar.add(id_hora);
	}
	
	itensr.data = data_aux_agendar;
	itensr.hora=ha;
	itensr.servico=se;
	itensr.funcionario=fu;
	
	listadeItens.add(itensr);
	
	Id_serv_aux_agendar = "";
	Id_funcionario_aux_agendar="";
	Id_horario_aux_agendar="";
	data_aux_agendar="";
		
}
public static void BD_agendar() throws SQLException{
    
    Secure secure = new Secure();
	String nomeusuario = secure.getNomeuser();
	BD_Agendar agendar = new BD_Agendar();

agendar.itensreserva.addAll(listadeItens);
agendar.total=total_aux_agendar;
agendar.cliente=Cliente_aux_agendar;

	if( secure.getNomeuser().equals("Admin"))
	{Application.Escolha_admin();}
	if(secure.getAuxlogin().equals("Cliente"))
	{Application.AreaCliente();}
	if(secure.getAuxlogin().equals("Funcionario"))
	{Application.OpcaoFuncionario();}
	
}
}